#include <iostream>
#include <string>
#include <regex>

int main()
{
    std::string str = "GET /hello/login?name=myh&password=12345 HTTP/1.1\r\n";
    std::regex pattern("(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\r\n|\n)?");//注意不要有或之间的空格,因为空格会被认为是分隔符
    //(GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE) 表示匹配它们中的任意一个
    //([^?]*) 表示匹配非？的任意字符，直到遇到?为止 * 表示匹配前面的字符0次或多次 + 表示匹配前面的字符1次或多次
    //.* 表示匹配任意字符，直到结束为止
    //\\? : 表示的是匹配?    (.*) 表示匹配？后面的任意字符，直到遇到空格结束为止 注意这里的.*不能有空格
    //(HTTP/1\\.[01]) 表示匹配HTTP/1.0或HTTP/1.1   \\. 表示匹配.   [01] 表示匹配0或1
    //(?:\r\n|\n)? 表示匹配\r\n或\n，非贪婪匹配，即匹配一次或不匹配 最后？表示匹配0次或1次 ?: 表示非捕获的匹配
    //(?:\\?(.*))? 表示匹配?后面的任意字符，直到遇到空格结束为止  注意这里的.*不能有空格  这个?:表示非捕获的匹配  因为?后面可能没有参数，所以用?:表示非捕获的匹配 
    std::smatch matchs;
    bool ret = std::regex_search(str, matchs, pattern);
    if (ret == false)
    {
        std::cout << "No match" << std::endl;
        return -1;
    }
    for (auto &s : matchs)
    {
        std::cout << s << std::endl;
    }
    return 0;
}